﻿
function clearCell(cell,hCell) {
    //распарсить ID  ячейки
    var p = docModel.parseID(cell.id);
    var tbl = docModel.getDocumentTable(p.TableNN);
    //проверить является ли ячейка элементом заголовка
    if (hCell.tdID == cell.id)
        return;

    //обнулить параметр строчки
    var r = tbl.getRow(p.RowNN);
    r[hCell.im].value = undefined;
    r[hCell.im].tdID = undefined;
}

//////////////////////////////////////////////////////////////////////КОНТЕКСТНОЕ МЕНЮ/////////////////////////////////////////////////////////////////////
Ext.define('TContextMenuTD', {
    extend: 'Ext.menu.Menu',
    items: [{
        id: 'clMNN',
        text: 'МНН',
        iconCls: 'edit',
        handler: MenuEventHandlers.mnuItemClick,
        arg: ''
    },//МНН
            {
         id: 'clTradeNM',
         text: 'Торговое наименование',
         iconCls: 'edit',
         handler: MenuEventHandlers.mnuItemClick,
         arg: ''
     },//Торговое наименование
            {
         id: 'clIzm',
         text: 'Единицы измерения',
         iconCls: 'edit',
         handler: MenuEventHandlers.mnuItemClick,
         arg: ''
     },//Единицы измерения
            {
            id: 'clInfo',
            text: 'Характеристики',
            iconCls: 'edit',
            handler: MenuEventHandlers.mnuItemClick          
        },//Характеристики
            {
            id: 'clCount',
            text: 'Количество',
            iconCls: 'edit',
            handler: MenuEventHandlers.mnuItemClick          
        },//Количество
            {
            id: 'clPrice',
            text: 'Цена за единицу',
            iconCls: 'edit',
            handler: MenuEventHandlers.mnuItemClick
        },//Цена за единицу
            {
            id: 'clClear',
            text: 'Очистить столбец',
            handler: MenuEventHandlers.mnuItemClearColumn
        },//Очистить столбец
            {
            id: 'clRowEditor',
            text: 'Редактировать данные',
            handler: MenuEventHandlers.mnuItemShowRowEditor
        }//Редактировать данные
        ]
});

//////////////////////////////////////////////////////////////////////АБСТРАКЦИЯ ЯЧЕЙКИ/////////////////////////////////////////////////////////////////////
Ext.define('Class.CellValue', {
    constructor: function (id) {
        this.isHeader = false;
        this.id = id;
        this.сellTypeVal = undefined;
        this.сellVal = undefined;
        return this;
    } 
});


//////////////////////////////////////////////////////////////////////АБСТРАКЦИЯ СТРОЧКИ/////////////////////////////////////////////////////////////////////
Ext.define('Class.RowValue', {
    constructor: function (id) {
         this.id = id;
         this.cells = [];
         return this;
     },

   getCellValueField:function (fieldName) {
        var result = "";
        for (var i = 0; i < this.cells.length; i++) {
            if (this.cells[i]['сellTypeVal'] == fieldName)
                result=result+' '+ this.cells[i]['сellVal'];
        }
        return result;
    },

    ///вернуть ячейку по ID
   getCell:function (id) {
        for (var i = 0; i < this.cells.length; i++) {
            if (this.cells[i]['id'] == id)
                return this.cells[i];
        }
        var c = new Class.CellValue(id)
        this.cells.push(c);
        return c;
    },

   ///вернуть данные в виде структуры {MNN:,TradeNM,Izm,Info,Count,Price}
   getValue:function (id) {
        var v = {
            MNN: this.getCellValueField('clMNN'),
            TradeNm: this.getCellValueField('clTradeNM'),
            Izm: this.getCellValueField('clIzm'),
            Info: this.getCellValueField('clInfo'),
            Count: this.getCellValueField('clCount'),
            Price: this.getCellValueField('clPrice')
         };        
        return v;
    }
});

/////////////////////////////////////////////////////////////////////АБСТРАКЦИЯ ТАБЛИЧКИ/////////////////////////////////////////////////////////////////////
Ext.define('Class.DocumentTable', {
 constructor: function (tbl) {
    this.id = tbl.getAttribute("id");
    this.tbl = tbl;
    this.rows = [];
    return this;
    },

 //веруть строчку по номеру
 getRow:function(id){    
        for(var i=0;i<this.rows.length;i++)
        {
            if (this.rows[i]['id'] == id)
                return this.rows[i];
        }

        var r = new Class.RowValue(id)
        this.rows.push(r);
        return r;
    }    
});

///////////////////////////////////////////////////////////////ПЕРЕЧИСЛЕНИЕ ТИПЫ ЯЧЙКИ///////////////////////////////////////////////////////////////
var CellTypeEnum = {
    clMNN: 'clMNN',
    clInfo: 'clInfo',
    clCount: 'clCount',
    clIzm: 'clIzm',
    clPrice: 'clPrice',
    clTradeNM: 'clTradeNM',

    clearCss: function (el) {
        el.removeCls("css_clMNN");
        el.removeCls("css_clInfo");
        el.removeCls("css_clIzm");
        el.removeCls("css_clCount");
        el.removeCls("css_clPrice");
        el.removeCls("css_clTradeNM");
    },

    getCssName: function (CellTypeEnumIDCellTypeField) {
        return "css_" + this[CellTypeEnumIDCellTypeField];
    },

    getModeByName: function (modeName) {

        switch (modeName) {
            case "clMNN":
                return CellTypeEnum.clMNN;
                break;

            case "clInfo":
                return CellTypeEnum.clInfo ;
                break;

            case "clIzm":
                return CellTypeEnum.clIzm;
                break;

            case "clPrice":
                return CellTypeEnum.clPrice;
                break;

            case "clCount":
                return CellTypeEnum.clCount;
                break;

            case "clTradeNM":
                return CellTypeEnum.clTradeNM;
                break;

            default:
                undefined;
        }


    }
}

///////////////////////////////////////////////////////////////TDocumentModel///////////////////////////////////////////////////////////////

Ext.define('Class.DocumentModel', {

    constructor: function (json) {
        this.superclass.constructor();
        this.DocID = DocID;
        this.Part = Part;
        this.tables = [];
        this.DataRows = [];
        return this;
    },

    //прогрузить данные с сервера
    loadData: function () {
        var pp = { Procedure: 'LoadAttachContent', args: { DocID: this.DocID, Part: this.Part} };
        var spp = Ext.encode(pp);
        Ext.Ajax.request({
            url: 'http://' + document.location.host + '/AdministrationPort.ashx',
            success: function (p) {
                //  debugger;
            },
            failure: function (p) { alert('Fail...'); },
            headers: {
                "Content-Type": "application/json; charset=utf-8",
                "Cache-Control": "no-cache"
            },
            params: spp
        });

    },

    //парсинг ид 
    parseID: function (ID) {
        var arr = ID.split('_');
        return {
            TableNN: arr[0],
            RowNN: arr[1],
            TdNN: arr[2],
            TableID: arr[0],
            RowID: arr[0] + "_" + arr[1],
            CellID: arr[0] + "_" + arr[1] + "_" + arr[2]
        }
    },

    //вернуть абстракцию таблички ро ID
    getDocumentTable: function (ID) {
        for (var i = 0; i < this.tables.length; i++) {
            if (this.tables[i].tbl["id"] == ID)
                return this.tables[i];
        }
    },

    // проверить заголовок
    isEmptyTable: function (tbl) {
        return tbl.rows.length == 0;
    },


    ///обойти все таблички и вернуть массив {MNN: TradeNm....}
    ///сформировать сырой набор данных в DataRows
    PopulateRawRows: function () {
        this.DataRows = [];
        //заполненные таблички 
        var fillTables = [];
        for (var i = 0; i < this.tables.length; i++) {
            if (!this.isEmptyTable(this.tables[i]))
                fillTables.push(this.tables[i]);
        }

        for (var i = 0; i < fillTables.length; i++) {
            for (var j = 0; j < fillTables[i].rows.length; j++) {
                this.DataRows.push(fillTables[i].rows[j].getValue());
            }
        }
    },

    //вернуть Json string соответсвующий сохраняемому объекту
    getSaveParams: function () {
        var result =
            { DocID: this.DocID,
                Part: this.Part,
                tables: []
            };

        for (var i = 0; i < this.tables.length; i++) {
            if (!this.isEmptyTable(this.tables[i]))
                result.tables.push(this.tables[i]);
        }
        return result;
    },

    //Добавить ячейку. По ид разобраться о принадлежности и добавить.
    addCell: function (сellTypeVal, domCell) {
        var cell = this.getCell(domCell.getAttribute("id"));
        cell.сellTypeVal = сellTypeVal;
        cell.сellVal = domCell.dom.innerText;
    },

    removeCell: function (сellTypeVal, domCell) {
        try {
            var oId = this.parseID(domCell.getAttribute("id"));
            var t = this.getDocumentTable(oId.TableNN);
            var r = t.getRow(oId.RowID);
            var newCells = [];

            //удаляем ячейку из строчки 
            for (var i = 0; i < r.cells.length; i++) {
                if (r.cells[i].id == oId.CellID)
                    continue;
                newCells.push(r.cells[i]);
            }
            r.cells = newCells;

            // если после удаления ячейки r.cell==0 удаляем строчку(формируем новый набор строк)
            var newRows = [];
            if (r.cells.length == 0)
                for (var i = 0; i < t.rows.length; i++) {

                    if (t.rows[i].id == oId.RowID)
                        continue;

                    newRows.push(t.rows.cells[i]);
                }

            t.rows = newRows;
        }
        catch (exception_var) {
            return;
        }
    },

    //по ID вернуть ячейку
    getCell: function (id) {
        var oId = this.parseID(id);
        var t = this.getDocumentTable(oId.TableNN);
        var r = t.getRow(oId.RowID);
        var c = r.getCell(oId.CellID);
        return c;
    },

    ///Сохранение в БД
    saveToDb: function () {
        var pp = { Procedure: 'SaveAttachContent', args: docModel.getSaveParams() };
        var spp = Ext.encode(pp);
        Ext.Ajax.request({
            url: 'http://' + document.location.host + '/AdministrationPort.ashx',
            success: function (p) { },
            failure: function (p) { alert('Fail...'); },
            headers: {
                "Content-Type": "application/json; charset=utf-8",
                "Cache-Control": "no-cache"
            },
            params: spp
        });

    }
}); 
